package com.neuedu.tast.dataimpl;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.neuedu.tast.bean.User;
import com.neuedu.tast.datacontroller.TeacherDataController;

public class TeacherDataImpl implements TeacherDataController {

	@Override
	public User selectByUsernameAndUserpwd(String username, String userpwd) throws Exception{
		//提取文件中数据
		List<User> listu=getAll();
		//进行比较：当数据中的某一条数据的username和password与查找的相同，则直接返回这条记录，
		for(User u:listu) {
			if(u.getUsername().equals(username)&&u.getUserpwd().equals(userpwd)) {
				return u;
			}
		}
		//上面的比配没有成功，返回null
		return null;
		
	}

	@Override
	public boolean add(User user,List<User> listuser) {
		if(user==null||user.getAddress()==null||user.getUsername()==null) {
			return false;
		}
		 listuser.add(user);
		return true;
	}

	@Override
	public boolean update(User user,List<User> listuser) {
		for(int i=0;i<listuser.size();i++) {//foreach 只能用于输出，但是我这要进行修改，所以选for
			if(listuser.get(i).getUserid().equals(user.getUserid())) {
				//处理id其他的全部修改
				listuser.get(i).setUsername(user.getUsername());
				listuser.get(i).setUserpwd(user.getUserpwd());
				listuser.get(i).setAge(user.getAge());
				return true;
			}
		}
		
		return false;
	}

	@Override
	public User delete(String name,List<User> listuser) {
		User user=null;
		for(int i=0;i<listuser.size();i++) {//foreach 只能用于输出，但是我这要进行修改，所以选for
			if(listuser.get(i).getUsername().equals(name)) {
				user=listuser.get(i);
				listuser.remove(i);
				return user;
			}
		}
		
	
		return null;
	}

	@Override
	public List<User> getAll() throws Exception{
		File file=new File("src/user.txt");
		if(!file.exists()) {
			System.out.println("文件不存在");
			return null;
		}
		FileInputStream  fis=new FileInputStream(file);
		BufferedInputStream bis=new BufferedInputStream(fis);
		ObjectInputStream ois=new ObjectInputStream(bis);
		List<User> listu=(List<User>)ois.readObject();
		ois.close();
		bis.close();
		fis.close();
		return listu;
	}

	/**
	 * 条件查询
	 * Map<String,Object>
	 *   key:存放的是字段，如username userpwd age sex
	 *   value：存放的字段对应的值：user  ddd    12 1
	 *   
	 *   字段是惟一的
	 */
	@Override    
	
	
	
	
	
	public List<User> getByCondition(Map<String, Object> condition) throws Exception{
		
		//提取文件中数据
				List<User> listu=getAll();
				//满足查询条件的数据存放在targetlist中
				List<User> targetlist=new ArrayList<>();
				for(User u:listu) {
					boolean flag=true;//假设，这条数据满足条件 
					//条件判断
					//使用if进行字段匹配，当某一字段（key）匹配成功，则 判断字段中的数据（value）是否在此数据库中
					//当value与之对应的值比配，则flag=false; 退出下面的for
					//u:用户的一条记录
					for(Map.Entry<String, Object> m:condition.entrySet()) {
						if(m.getKey().equals("username")) {
							if(!u.getUsername().equals((String)(m.getValue()))) {
								flag=false;
								break;
							}
						}else if(m.getKey().equals("userpwd")) {
							if(!u.getUserpwd().equals((String)(m.getValue()))) {
								flag=false;
								break;
							}
						}else if(m.getKey().equals("sex")) {
							if(!u.getSex().equals((Integer)(m.getValue()))) {
								flag=false;
								break;
							}
						}else if(m.getKey().equals("age")) {
							if(!u.getAge().equals((Integer)(m.getValue()))) {
								flag=false;
								break;
							}
						}
					}
					
					//判断flag的值，当flag为true是，说明此用户满足条件，则，存入到targetlist中
					if(flag) {
						targetlist.add(u);
					}
					
				}
		if(targetlist.size()>0) {
		   return targetlist;
		}else {
			return null;
		}
	}

	@Override
	public boolean saveFile(List<User> user) throws Exception{
		//路径，注意user.txt的位置
		File file=new File("src/user.txt");
		if(!file.exists()) {
			file.createNewFile();
		}
		FileOutputStream fos=new FileOutputStream(file);
		BufferedOutputStream bos=new BufferedOutputStream(fos);
		ObjectOutputStream oos=new ObjectOutputStream(bos);
		oos.writeObject(user);
		oos.flush();
		oos.close();
		bos.close();
		fos.close();
		return true;
	}

}
